﻿//------------------------------------------------------------------------------
// ╭─────────────────────────────╮
// │ ╭─╮     ╭─╮              TM │   ╠═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╣
// │ │ │     │ │                 │                                           ☺  
// │ │ ╰───╮ │ │ ╭─────╮ ╭─────╮ │     Name:Wedn.Net 数据库访问层基接口   ♮ ♪ ♩
// │ │ ╭─╮ │ │ │ │ ╭─╮ │ │ ╭─╮ │ │                                    ♫ ♭      
// │ │ ╰─╯ │ │ │ │ ╰─╯ │ │ ╰─╯ │ │     Author:iceStone               ♬ ♪       
// │ └─────╯ └─╯ ╰─────╯ ╰───╮ │ │     Chinese:汪磊                              
// │                     ┌───╯ │ │                                              
// │                     ╰─────╯ │   ╠═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╬═╣
// ╰─────────────────────────────╯                                              
//------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;

namespace Wedn.Net.IDAL
{
    /// <summary>
    /// 数据库访问层基接口
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface IBaseDAO<T> where T : class, new()
    {
        DbSet<T> DbSet { get; }
        /// <summary>
        /// 向数据库表中插入一个对象记录
        /// </summary>
        /// <param name="entity">要插入的实体对象</param>
        /// <returns>插入完成的实体</returns>
        T Insert(T entity);
        /// <summary>
        /// 向数据库表中插入一个对象记录
        /// </summary>
        /// <param name="entity">要插入的实体对象</param>
        /// <param name="commit">是否提交到数据库</param>
        /// <returns>插入完成的实体</returns>
        T Insert(T entity, bool commit);
        /// <summary>
        /// 向数据库中插入多条数据
        /// </summary>
        /// <param name="entitys">要插入的实体</param>
        /// <returns>当前实体</returns>
        IList<T> Insert(params T[] entitys);
        /// <summary>
        /// 向数据库中插入多条数据
        /// </summary>
        /// <param name="commit">是否提交到数据库</param>
        /// <param name="entitys">要插入的实体</param>
        /// <returns>当前实体</returns>
        IList<T> Insert(bool commit, params T[] entitys);
        /// <summary>
        /// 删除数据库表中的一个实体记录
        /// </summary>
        /// <param name="entity">要删除的实体</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(T entity);
        /// <summary>
        /// 删除数据库表中的一个实体记录
        /// </summary>
        /// <param name="entity">要删除的实体</param>
        /// <param name="commit">是否提交到数据库</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(T entity, bool commit);
        /// <summary>
        /// 批量删除数据库表中对应的数据记录
        /// </summary>
        /// <param name="ids">要删除的数据主键ID</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(params int[] ids);
        /// <summary>
        /// 批量删除数据库表中对应的数据记录
        /// </summary>
        /// <param name="commit">是否提交到数据库</param>
        /// <param name="ids">要删除的数据主键ID</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(bool commit, params int[] ids);
        /// <summary>
        /// 更新数据库表中的一个实体
        /// </summary>
        /// <param name="entity">要更新的实体</param>
        /// <returns>执行结果受影响行数</returns>
        int Update(T entity);
        /// <summary>
        /// 更新数据库表中的一个实体
        /// </summary>
        /// <param name="entity">要更新的实体</param>
        /// <param name="commit">是否提交到数据库</param>
        /// <returns>执行结果受影响行数</returns>
        int Update(T entity, bool commit);
        /// <summary>
        /// 更新数据库中的多个实体
        /// </summary>
        /// <param name="entitys">更新的实体</param>
        /// <returns>执行结果受影响行数</returns>
        int Update(params T[] entitys);
        /// <summary>
        /// 更新数据库中的多个实体
        /// </summary>
        /// <param name="commit">是否提交到数据库</param>
        /// <param name="entitys">更新的实体</param>
        /// <returns>执行结果受影响行数</returns>
        int Update(bool commit, params T[] entitys);
        /// <summary>
        /// 根据传入委托查询出存在条数
        /// </summary>
        /// <param name="where">筛选条件表达式</param>
        /// <returns>存在条数</returns>
        int SelectCount(Expression<Func<T, bool>> where);
        /// <summary>
        /// 根据传入委托筛选出对应的单个数据实体
        /// </summary>
        /// <param name="where">筛选条件表达式</param>
        /// <returns>查询到单个数据实体</returns>
        T SelectSingle(Expression<Func<T, bool>> where);
        /// <summary>
        /// 根据传入委托筛选出对应的数据实体集合
        /// </summary>
        /// <param name="where">筛选条件表达式</param>
        /// <returns>查询到数据实体集合</returns>
        IQueryable<T> Select(Expression<Func<T, bool>> where);
        /// <summary>
        /// 根据传入筛选委托和分页条件筛选出对应页面的数据实体集合
        /// </summary>
        /// <typeparam name="F">排序字段类型</typeparam>
        /// <param name="pageIndex">当前页码</param>
        /// <param name="pageSize">当前页大小</param>
        /// <param name="totalCount">输出查询到的记录数</param>
        /// <param name="where">筛选条件委托</param>
        /// <param name="orderBy">排序字段委托</param>
        /// <param name="isDesc">是否降序</param>
        /// <returns>分页查询到数据实体集合</returns>
        IQueryable<T> SelectPage<F>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> where, Expression<Func<T, F>> orderBy, bool isDesc);
        /// <summary>
        /// 执行一个非查询的T-SQL语句，返回受影响行数
        /// </summary>
        /// <param name="sql">T-SQL语句</param>
        /// <param name="parameters">参数列表</param>
        /// <returns>受影响行数</returns>
        int ExcuteNonQuery(string sql, params object[] parameters);
        /// <summary>
        /// 执行一个原始SQL查询，返回泛型类型迭代器
        /// </summary>
        /// <param name="sql">T-SQL语句</param>
        /// <param name="parameters">参数列表</param>
        /// <returns>泛型类型迭代器</returns>
        IEnumerable<T> SqlQuery(string sql, params object[] parameters);
        /// <summary>
        /// 保存数据库的改变状态
        /// </summary>
        /// <returns>受影响行数</returns>
        int SaveChanges();
    }
}
